#include<iostream>
#include "blockqueue.hpp"
#include "task.hpp"
#include <unistd.h>

//不断产生任务
void* Product(void*args)
{
    blockqueue<task> *bq=static_cast<blockqueue<task>*>(args);
    while(1)
    {
        int data1=rand()%10+1;
        int data2=rand()%10;
        char oper=opers[rand()%4];
        task _task(data1,data2,oper);
        bq->Push(_task);
        printf("生产了一个任务: %s,thread id: %d\n ",_task.GetTask().c_str(),pthread_self());
        sleep(1);
    }
}

//不断解决任务
void* Consumer(void*args)
{
    blockqueue<task> *bq=static_cast<blockqueue<task>*>(args);
    while(1)
    {
        task _task=bq->Pop();
        _task.run();
        printf("处理任务: %s ,运算结果是: %s ,thread id: %d\n ",_task.GetTask().c_str(),_task.GetResult().c_str(),pthread_self());
        sleep(1);
    }
}


int main()
{
    srand(time(nullptr));
    blockqueue<task>*bq=new blockqueue<task>(20);

    pthread_t c[3],p[5];

    for(int i=0;i<5;i++)
    {
        pthread_create(p+i,nullptr,Product,bq); //传入的bq得在堆空间
    }
    
    for(int i=0;i<3;i++)
    {
        pthread_create(c+i,nullptr,Consumer,bq); 
    }


    for(int i=0;i<5;i++)
    {
        pthread_join(p[i],nullptr);
    }

    for(int i=0;i<3;i++)
    {
        pthread_join(c[i],nullptr);
    }

    return 0;
}